package com.cc.data_explore.test;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableRow;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

public class FixedHighlightTable extends Application {

    public static class DataItem {
        private final SimpleStringProperty col1;
        private final SimpleStringProperty col2;
        private final SimpleStringProperty col3;

        public DataItem(String col1, String col2, String col3) {
            this.col1 = new SimpleStringProperty(col1);
            this.col2 = new SimpleStringProperty(col2);
            this.col3 = new SimpleStringProperty(col3);
        }

        public String getCol1() {
            return col1.get();
        }

        public String getCol2() {
            return col2.get();
        }

        public String getCol3() {
            return col3.get();
        }
    }

    private TableView<DataItem> tableView;
    private int lastHighlightedRow = -1;
    private TableColumn<DataItem, ?> lastHighlightedColumn = null;
    TableRow<DataItem> pretableRow = null;
    TableColumn<DataItem, String> pretableColumn = null;

    @Override
    public void start(Stage stage) {
        tableView = new TableView<>();

        for (int i = 0; i < 50; i++) {
            TableColumn<DataItem, String> col3 = createColumn("列" + i, "col3");
            tableView.getColumns().add(col3);
        }
        for (int i = 0; i < 10000; i++) {

            tableView.getItems().add(new DataItem("A" + i, "B" + i, "C" + i));
        }

        // 启用单元格选择模式
        tableView.getSelectionModel().setCellSelectionEnabled(true);

        // 关键修复点：使用行工厂动态设置行高亮
        // tableView.setRowFactory(tv -> {
        //     TableRow<DataItem> row = new TableRow<>();
        //
        //     row.indexProperty().addListener((obs, oldIndex, newIndex) -> {
        //         updateRowStyle(row);
        //     });
        //     return row;
        // });

        /*tableView.getSelectionModel().selectedIndexProperty().addListener((obs, oldIndex, newIndex) -> {

        });*/
        // 监听焦点单元格变化（同时处理行和列高亮）
        tableView.getFocusModel().focusedCellProperty().addListener((obs, oldCell, newCell) -> {
            // 清除旧行高亮
            // if (lastHighlightedRow != -1) {
            //     TableRow<?> oldRow = (TableRow<?>) tableView.lookup(".table-row-cell:" + lastHighlightedRow);
            //     if (oldRow != null) {
            //         oldRow.setStyle("");
            //     }
            // }
            //
            // // 设置新行和列高亮
            // if (newCell != null) {
            //     lastHighlightedRow = newCell.getRow();
            //     lastHighlightedColumn = newCell.getTableColumn();
            //
            //     // 直接更新当前行样式
            //     TableRow<?> currentRow = (TableRow<?>) tableView.lookup(".table-row-cell:" + lastHighlightedRow);
            //     if (currentRow != null) {
            //         currentRow.setStyle("-fx-background-color: #e6f3ff;");
            //     }
            // }

            // 强制刷新表格（确保所有行更新）
            //tableView.refresh();
        });

        Scene scene = new Scene(tableView, 600, 400);
        scene.getStylesheets().add(getClass().getResource("/style.css").toExternalForm());
        stage.setScene(scene);
        stage.setTitle("修复后的行列高亮");
        stage.show();
    }

    // 动态更新行样式
    private void updateRowStyle(TableRow<DataItem> row) {
        int rowIndex = row.getIndex();
        boolean isHighlighted = rowIndex == lastHighlightedRow;
        row.setStyle(isHighlighted ? "-fx-background-color: #e6f3ff;" : "");
    }

    // 创建列并设置单元格工厂（处理列高亮）
    private TableColumn<DataItem, String> createColumn(String title, String property) {
        TableColumn<DataItem, String> column = new TableColumn<>(title);
        column.setCellValueFactory(new PropertyValueFactory<>(property));

        column.setCellFactory(tc -> {

            TableCell<DataItem, String> cell = new TableCell<DataItem, String>() {
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);
                    setText(empty ? null : item);

                    // // 判断当前列是否高亮
                    // boolean isColumnHighlighted = getTableColumn() == lastHighlightedColumn;
                    // // 判断当前行是否高亮
                    // boolean isRowHighlighted = getIndex() == lastHighlightedRow;
                    //
                    // // 合并行和列的高亮样式
                    // if (isRowHighlighted && isColumnHighlighted) {
                    //     // setStyle("-fx-background-color: #FFF;");
                    // } else if (isRowHighlighted) {
                    //     setStyle("-fx-background-color: #e6f3ff;");
                    // } else if (isColumnHighlighted) {
                    //     setStyle("-fx-background-color: #e6f3ff;");
                    // } else {
                    //     setStyle("");
                    // }
                }
            };
            cell.setOnMousePressed(event -> {
                TableRow<DataItem> tableRow = cell.getTableRow();
                TableColumn<DataItem, String> tableColumn = cell.getTableColumn();
                if (pretableColumn != null) {
                    pretableColumn.getStyleClass().remove("test_back");
                }
                if (pretableRow != null) {
                    pretableRow.getStyleClass().remove("test_back");
                }
                tableRow.getStyleClass().add("test_back");
                tableColumn.getStyleClass().add("test_back");
                pretableColumn = tableColumn;
                pretableRow = tableRow;
            });
            return cell;
        });

        return column;
    }

    private void highlightColumn(TableColumn<DataItem, ?> column) {
        // 标记状态，实际样式在单元格工厂中处理
    }

    private void clearColumnHighlight(TableColumn<DataItem, ?> column) {
        // 标记状态，实际样式在单元格工厂中处理
    }

    public static void main(String[] args) {
        launch(args);
    }
}
